总概:在复制过程中有浅层 Copy和深层 Copy。从字面意思上理解:浅层 Copy 是仅仅复制指向内存对象,深层 Copy 是复制对象和对象指向的内存。
下面展示浅层 Copy 和 深层 Copy 展示:
简言之:浅层 Copy 只复制对象内存地址不变,深层 Copy 既复制对象又复制指向的内存 & 内存地址发生改变。
更具复制的对象不同可以分为两种情况:
- 集合类对象复制
- 非集合类对象
集合类复制
集合类的浅复制(Shallow Copy)
集合类在浅层复制即时 retain 计数进行 + 1,而且指向内存对象复制添加到新的集合之中。
1 | NSArray *person = [NSArray arrayWithObjects:@"name", @"age", @"school", @"company", nil]; |
集合类的深复制(Deep Copy)
集合类深层复制有两种方法可以实现:
1)使用 iOS 提供的 API 的接口
2)使用归档(archive)和解档(unarchive)形式进行
3) 使用系统的 Copy
和 MutableCopy
iOS 给定 API
集合类的深层复制,只需要把 initWithArray:copyItems:
的函数值设置为 YES
就可以实现当前集合类实现深层复制。
1 | NSArray *person = [NSArray arrayWithObjects:@"name", @"age", @"school", @"company", nil]; |
归档(archive)和解档(unarchive)
1 | NSArray *person = [NSArray arrayWithObjects:@"name", @"age", @"school", @"company", nil]; |
注意:
(1)在集合类的深层复制过程中,需要满足一个前提条件:当前集合类需要实现
NSCoping
或者NSMutableCopying
协议。否则会抛出异常。
(2)在使用 iOS 提供的 API 中完成的Copy
是one-level-deep copy
,使用归档(archive)和解档(unarchive)
完成是真正的深层Copy
。苹果开发文档
使用系统的 Copy
和 MutableCopy
- 不可变对象的复制
- 可变对象的复制
1)不可变对象的复制
下面👇代码实现不可变对象:
1 | NSArray *personCopy = [person copy]; |
2)可变对象复制
1 | NSMutableArray *family = [NSMutableArray arrayWithObjects:@"father", @"mother", @"sister", @"brother", @"son", @"daughter", nil]; |
根据上面:
(1)不可变 copy 浅复制
(2)可变 copy 单层深复制
(3)不可变 mutableCopy 单层深复制
(4)可变 mutableCopy 单层深复制
非集合类复制
在非集合类实现复制通常使用系统提供的方法:
- 不可变对象的复制
- 可变对象的复制
不可变对象复制
下面👇代码实现不可变对象:
1 | NSString *nameCopy = [name copy]; |
可变对象复制
1 | NSMutableString *mutableName = [NSMutableString stringWithString:@"Jack Jin"]; |
根据上面:
(1)不可变 copy 浅复制
(2)可变 copy 深复制
(3)不可变 mutableCopy 深复制
(4)可变 mutableCopy 深复制
参考资料:
Copying Collections
NSCopying和NSMutableCopying协议
Object copying
What is the difference between a deep copy and a shallow copy?